package com.itheima.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 包名:com.itheima.aspect
 *
 * @author Leevi
 * 日期2020-08-12  08:39
 *
 * 1. 注解方式配置切入点 在方法上添加Pointcut注解配置切入点，方法的名字就是切入点的唯一标识
 * 2. 配置通知
 *    1. 前置通知 Before注解
 *    2. 后置通知 AfterReturning注解
 *    3. 异常通知 AfterThrowing注解
 *    4. 最终通知 After注解
 *    5. 环绕通知 Around注解
 * 3. 配置切面:在切面类上添加Aspect注解
 */
@Component
@Aspect
public class PermissionAspect {
    @Pointcut("execution(* com.itheima.service.impl.UserServiceImpl.*(..))")
    public void pt1(){

    }

    @Pointcut("execution(* com.itheima.service.impl.UserServiceImpl.update(..))")
    public void pt2(){

    }

    @Before("pt1()")
    public void checkPermission(){
        System.out.println("校验权限...");
    }

    @AfterReturning("pt1()")
    public void printLog(){
        System.out.println("打印日志...");
    }

    @AfterThrowing("pt1()")
    public void showException(){
        System.out.println("出现异常了，请检查...");
    }

    @After("pt1()")
    public void showEnd(){
        System.out.println("执行完毕...");
    }

    //计算目标方法的执行时长
    @Around("pt2()")
    public void showMillions(ProceedingJoinPoint joinPoint){
        //1. 记录当前时间
        long timeMillis1 = System.currentTimeMillis();
        //2. 执行目标方法
        try {
            joinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        //3. 再记录当前时间
        long timeMillis2 = System.currentTimeMillis();
        //4. 将两次的时间相减，得到方法的执行时长
        System.out.println(timeMillis2 - timeMillis1);
    }
}
